package com.learning.optimize.jdk.reflect;

import java.lang.reflect.Array;

/**
 * ClassName: ArrayReflect
 * Description: Array类以及数组反射
 * Date: 2018/7/18 14:18 【需求编号】
 *
 * @author Sam Sho
 * @version V1.0.0
 */
public class ArrayReflect {

    public static void main(String[] args) throws ClassNotFoundException {
        test2();
    }

    static void test() {
        int[] a1 = new int[3];
        int[] a2 = new int[4];
        int[][] a3 = new int[2][3];
        String[] a4 = new String[3];

        System.out.println(a1 == a2);

        // true 同样类型且具有相同维度的数组拥有同一份字节码
        System.out.println(a1.getClass() == a2.getClass());
    }

    static void test2() throws ClassNotFoundException {
        int[] array = {1, 2, 3, 4, 5, 6, 7, 8, 9};
        //获取数组类型的Class 即int.class
        Class<?> clazz = array.getClass().getComponentType();

        //创建一个具有指定的组件类型和长度的新数组。
        //第一个参数:数组的类型,第二个参数:数组的长度
        Object newArr = Array.newInstance(clazz, 15);
        //获取原数组的长度
        int co = Array.getLength(array);
        //赋值原数组到新数组
        System.arraycopy(array, 0, newArr, 0, co);
        for (int i : (int[]) newArr) {
            System.out.print(i + ",");
        }

        //创建了一个长度为10 的字符串数组，
        //接着把索引位置为6 的元素设为"hello world!"，然后再读取索引位置为6 的元素的值
        Class clazz2 = Class.forName("java.lang.String");

        //创建一个长度为10的字符串数组，在Java中数组也可以作为Object对象
        Object array2 = Array.newInstance(clazz2, 10);

        //把字符串数组对象的索引位置为6的元素设置为"hello"
        Array.set(array2, 6, "hello world!");

        //获得字符串数组对象的索引位置为5的元素的值
        String str = (String) Array.get(array2, 6);
        System.out.println();
        // hello world!
        System.out.println(str);
    }

    /**
     * @param a
     * @param <T>
     */
    static <T extends Comparable<T>> void test2(T[] a) {

        // 通过反射创建相同类型的数组
        T[] b = (T[]) Array.newInstance(a.getClass().getComponentType(), a.length);
        for (int i = 0; i < a.length; i++) {
            b[i] = a[i];
        }
        T min = null;
        boolean flag = true;
        for (int i = 0; i < b.length; i++) {
            if (flag) {
                min = b[i];
                flag = false;
            }
            if (b[i].compareTo(min) < 0) {
                min = b[i];
            }
        }
        System.out.println(min);
    }

}
